const childProcess = require("child_process");
const path = require("path");

// 首先，exec() 内部调用 execFile() 来实现，而 execFile() 内部调用 spawn() 来实现。
const spawn = childProcess.spawn;
const exec = childProcess.exec;
const execFile = childProcess.execFile;

// 创建子进程的方式：
/*
  exec()， execFile()，fork()，这些底层都是通过 spawn 来创建子进程的；
  exec()， execFile()，提供了回调函数，当进程退出的时候，会调用

  NOTE:
  child_process.spawn(command[, args][, options])
  child_process.exec(command[, options][, callback])
  child_process.execFile(file[, args][, options][, callback])
  child_process.fork(modulePath[, args][, options])
*/

// 文件压缩， 增量部署，
// const ls = spawn("ls", ["-lh", "/home/joah/workspace"]);

// ls.stdout.on("data", (data) => {
//   console.log(data.toString());
// });

// ls.stderr.on("data", (d) => {
//   console.log("error", d.toString());
// });

// ls.on("close", (code) => {
//   console.log("error", code);
// });

// ls.stdout.on('data', (data) => {
//   console.log(data)
// })

// exec("ls -al", (error, stdout, stderr) => {
//   console.log(error);
//   console.log(stdout);
//   console.log(stderr);
// });

// exec("ls 1.txt", (error, stdout, stderr) => {
//   console.log(error);
//   // console.log(stdout);
//   // console.log(stderr);
// });

console.log(path.resolve(__dirname));

// 如果是用户输入的命令；要注意 XSS 攻击
// 这个会创建一个 shell； 然后将命令给这个 shell 去执行
exec(
  "ls -al ./",
  {
    cwd: path.resolve(__dirname),
  },
  (error, stdout, stderr) => {
    console.log("exec")
    console.log(error);
    console.log(stdout);
    // console.log(stderr);
  }
);

// 执行一个可执行文件的文件或者是路径
// 和 exec 的区别就是是否会开启一个 shell
execFile("ls -al ./", { shell: "/bin/zsh" }, (error, stdout, stderr) => {
  console.log("execFile")
  console.log(error);
  console.log(stdout);
});


